点击上方 "程序员小乐" ,关注公众号
8点20分,第一时间与你相约
每日英文
I can accept failure but I can't accept not trying.
我可以接受失败,但绝对不能接受未曾奋斗过的自己。
每日掏心话
人生的道路上,有些事只能自己面对,我很想依赖,但必须坚强。有时候,上天没有给你想要的,不是因为你不配,而是你值得拥有更好的。
来自:陈于喆 | 责编:乐乐
链接:juejin.im/post/5cdfe4a16fb9a07ef63facc3
图片来自网络
00 前言
用户模块
商品模块(库存)
订单模块
支付模块
01 DDD 领域驱动设计
Infrastructure(基础实施层)
Domain(领域层)
Application(应用层)
Interfaces(表示层,也叫用户界面层或是接口层)
微服务结合 DDD
划分“战略建模”,从一种宏观的角度去审核整个项目,划分出“界限上下文”,形成具有上帝视角的“上下文映射图”。
还有一个建模是“战术建模”,在我们的“战略建模”划分出来的“界限上下文”中进行“聚合”,“实体”,“值对象”,并按照模块分组。
销售域
商品域
用户域
订单域
支付域
02 时序图
03 微服务技术栈选型
04 微服务的利和弊
05 微服务怎么做逻辑分层
06 分布式事务
一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。
Basically Available(基本可用)
Soft state(软状态)
Eventually consistent(最终一致性)
查看商品详情(或购物车)
计算商品价格和目前商品存在库存(生成订单详情)
商品扣库存(调用商品库存服务)
订单确认(生成有效订单)
如果扣减库存成功,将订单状态改为 “确认订单” ,下单成功。
如果扣减库存失败,将订单状态改为 “失效订单” ,下单失败。
Try 阶段:Try 只是一个初步的操作,进行初步的确认,它的主要职责是完成所有业务的检查,预留业务资源。
Confirm 阶段:Confirm 是在 Try 阶段检查执行完毕后,继续执行的确认操作,必须满足幂等性操作,如果 Confirm 中执行失败,会有事务协调器触发不断的执行,直到满足为止。
Cancel:是取消执行,在 Try 没通过并释放掉 Try 阶段预留的资源,也必须满足幂等性,跟 Confirm 一样有可能被不断执行。
这个就涉及 TCC 的事务协调器了,事务协调器就 Confirm 或 Cancel 没有得到返回的时候,会启用定时器不断的进行 Confirm 或 Cancel 的重试。
这个也就是我们强调,Confirm,Cancel 接口必须是幂等性的一个原因了。
还有同学会问了,为什么事务协调器知道 Confirm,或 Cancel 没有完成。
这个就涉及到了 TCC 也做了一张本地消息表,会记录一次事务,包括主事务,子事务,事务的完成情况都会记录在这种表中(当然未必是表,可能是 ZK,Redis 等等介质),然后启用一个定时器去检查这种表。
还有同学会问,事务怎么传递,这个就涉及使用的 TCC 的框架了,一般来说用的都是隐式传参的方式。
在主事务创建的时候用隐式传参调用子事务,子事务包含 Try,Confirm,Cancel 都会记录到事务表里面。
07 熔断限流隔离降级
构建一个 HystrixCommand 对象,用于封装请求,并在构造方法配置请求被执行需要的参数。
执行命令,Hystrix 提供了几种执行命令的方法,比较常用到的是 Synchrous 和 Asynchrous。
判断电路是否被打开,如果被打开,直接进入 Fallback 方法。
判断线程池/队列/信号量是否已经满,如果满了,直接进入 Fallback 方法。
执行 Run 方法,一般是 HystrixCommand.run(),进入实际的业务调用,执行超时或者执行失败抛出未提前预计的异常时,直接进入 Fallback 方法。
无论中间走到哪一步都会进行上报 Metrics,统计出熔断器的监控指标。
Fallback 方法也分实现和备用的环节。
最后是返回请求响应。
08 集中式配置中心
Pull 模式,服务定时去拉取配置中心的数据。
Push 模式,服务一直连接到配置中心上,一旦配置有变成,配置中心将把变更的参数推送到对应的微服务上。
Pull 一般使用定时器拉取,就算某一个网络抖动没有 Pull 成功,在下一次定时器的时候,终将能保证获取最新的配置。
Push 可以避免 Pull 定时器存在的延时,基本可以做到实时获取数据,但也有问题就是网络抖动的时候可能会丢失更新。
09 调用链监控&日志
首先在实现方式上,Skywalking 基本对于代码做到了无入侵,采用 Java 探针和字节码增强的方式,而在 Cat 还采用了代码埋点,而 Zipkin 采用了拦截请求,Pinpoint 也是使用 Java 探针和字节码增强。
其次在分析的颗粒度上,Skywaling 是方法级,而 Zipkin 是接口级,其他两款也是方法级。
在数据存储上,Skywalking 可以采用日志体系中比较出名的 ES,其他几款,Zipkin 也可以使用 ES,Pinpoint 使用 Hbase,Cat 使用 MySQL 或 HDFS,相对复杂。由于目前公司对 ES 熟悉的人才比较有保证,选择熟悉存储方案也是考虑技术选型的重点。
还有就是性能影响,根据网上的一些性能报告,虽然未必百分百准备,但也具备参考价值,Skywalking 的探针对吞吐量的影响在 4 者中间是最效的,经过对 Skywalking 的一些压测也大致证明。
10 Docker + Kubernetes
11 部署到生产,预估容量
监控系统哪去了(基础设施监控,系统监控,应用监控,业务监控)
网关哪里去了
统一的异常处理哪里去了
API 文档哪里去了
容器化哪里去了
服务编排哪里去了
……
我在微服务里经历了什么?
欢迎在评论区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,或者在学习能力的提升上有新的认识,欢迎转发分享给更多人。
欢迎各位读者加入程序员小乐读者群,在公众号后台回复“加群”或者“学习”即可。
猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
面试官问我:一个 TCP 连接可以发多少个 HTTP 请求?我竟然回答不上来...
35 个小细节,让你的Java 代码如鱼得水
这5G不就网速快了点,还能做啥子?
图解:什么是渗流算法?
这里有技术、心得、算法、职场、感悟、面经,做一个有趣的帮助程序员成长的公众号。
文章有问题?点此查看未经处理的缓存